// Set 数据结构
// Set是一个类型
// Set集合中的值是不重复的
const s = new Set();
// add方法会返回集合对象本身
s.add(1).add(2).add(3).add(2).add(4).add(2);
// 遍历获取值
s.forEach((i) => console.log(i));
for (let i of s) {
    console.log(i);
}
// size和length获取长度
console.log(s.size); // 4
// has判断集合中是否存在某个值
console.log(s.has(2)); // true
// delete删除集合中某个值
console.log(s.delete(3)); //true
// clear清除集合中所有值
s.clear();
console.log(s);

// 使用Set去重 返回值是一个集合,需要做处理才能拿到数组
const arr = [1, 2, 3, 2, 1, 4, 3];
let result = new Set(arr);
let result2 = Array.from(new Set(arr));
let result3 = [...new Set(arr)];
console.log(result); // Set { 1, 2, 3, 4 }
console.log(result2); // [ 1, 2, 3, 4 ]
console.log(result3); // [ 1, 2, 3, 4 ]

// --------------------------------------------

// Map 数据结构
const obj = {};
obj[true] = "true";
obj[123] = "123";
obj[{ name: "jack" }] = "value";
// 如果对象的键不是字符串,则内部会对键值toString变成字符串
// 所以以下的输出结果就是
console.log(Object.keys(obj)); // [ '123', 'true', '[object Object]' ]
// 如果将对象作为键,对象toString之后的值是一样的,那么就无法区分
console.log(obj[{}]); // value
console.log(obj["[object Object]"]); // value

// 如果使用map则可以避免这一情况的发生
// 创建一个map集合
const m = new Map();
const jack = { name: "jack" };
// 调用set方法存储数据,键可以是任何数据
m.set(jack, 18);
console.log(m); // Map { { name: 'jack' } => 18 }
// 调用get方法获取数据
console.log(m.get(jack)); // 18
// 调用has方法判断某个键是否存在
console.log(m.has(jack)); // true
// forEach方法第一个参数是值, 第二个参数是键
m.forEach((value, key) => {
    console.log(value); // 18
    console.log(key); // { name: 'jack' }
});
// delete删除某个键和其对应的值
console.log(m.delete(jack)); // true
// clear清空整个集合
m.clear();
